package com.micro.ai.auth.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.micro.ai.auth.entity.RoleMenu;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 角色-菜单关联 Mapper
 * 
 * @author micro-ai
 * @since 2.0.0
 */
@Mapper
public interface RoleMenuMapper extends BaseMapper<RoleMenu> {
    
    /**
     * 根据角色ID查询关联的菜单ID列表
     * 
     * @param roleId 角色ID
     * @return 菜单ID列表
     */
    @Select("SELECT menu_id FROM role_menus WHERE role_id = #{roleId}")
    List<String> selectMenuIdsByRoleId(@Param("roleId") String roleId);
    
    /**
     * 根据菜单ID查询关联的角色ID列表
     * 
     * @param menuId 菜单ID
     * @return 角色ID列表
     */
    @Select("SELECT role_id FROM role_menus WHERE menu_id = #{menuId}")
    List<String> selectRoleIdsByMenuId(@Param("menuId") String menuId);
    
    /**
     * 根据角色ID和菜单ID查询关联
     * 
     * @param roleId 角色ID
     * @param menuId 菜单ID
     * @return 角色菜单关联
     */
    @Select("SELECT * FROM role_menus WHERE role_id = #{roleId} AND menu_id = #{menuId} LIMIT 1")
    RoleMenu selectByRoleAndMenu(@Param("roleId") String roleId, @Param("menuId") String menuId);
    
    /**
     * 根据角色ID删除关联
     * 
     * @param roleId 角色ID
     * @return 影响行数
     */
    @Delete("DELETE FROM role_menus WHERE role_id = #{roleId}")
    int deleteByRoleId(@Param("roleId") String roleId);
    
    /**
     * 根据菜单ID删除关联
     * 
     * @param menuId 菜单ID
     * @return 影响行数
     */
    @Delete("DELETE FROM role_menus WHERE menu_id = #{menuId}")
    int deleteByMenuId(@Param("menuId") String menuId);
    
    /**
     * 批量插入角色菜单关联
     * 
     * @param roleMenus 角色菜单关联列表
     * @return 影响行数
     */
    @Insert("<script>" +
            "INSERT INTO role_menus (id, role_id, menu_id, created_at, updated_at) VALUES " +
            "<foreach collection='roleMenus' item='item' separator=','>" +
            "(#{item.id}, #{item.roleId}, #{item.menuId}, #{item.createdAt}, #{item.updatedAt})" +
            "</foreach>" +
            "</script>")
    int batchInsert(@Param("roleMenus") List<RoleMenu> roleMenus);
    
    /**
     * 根据用户ID查询菜单ID列表（通过角色）
     * 
     * @param userId 用户ID
     * @return 菜单ID列表
     */
    @Select("SELECT DISTINCT rm.menu_id FROM role_menus rm " +
            "INNER JOIN user_roles ur ON rm.role_id = ur.role_id " +
            "WHERE ur.user_id = #{userId}")
    List<String> selectMenuIdsByUserId(@Param("userId") String userId);
    
    /**
     * 根据用户ID和菜单ID查询关联
     * 
     * @param userId 用户ID
     * @param menuId 菜单ID
     * @return 角色菜单关联列表
     */
    @Select("SELECT rm.* FROM role_menus rm " +
            "INNER JOIN user_roles ur ON rm.role_id = ur.role_id " +
            "WHERE ur.user_id = #{userId} AND rm.menu_id = #{menuId}")
    List<RoleMenu> selectByUserAndMenu(@Param("userId") String userId, @Param("menuId") String menuId);
    
    /**
     * 根据用户ID查询所有角色菜单关联（用于获取用户的所有菜单）
     * 
     * @param userId 用户ID
     * @return 角色菜单关联列表
     */
    @Select("SELECT rm.* FROM role_menus rm " +
            "INNER JOIN user_roles ur ON rm.role_id = ur.role_id " +
            "WHERE ur.user_id = #{userId}")
    List<RoleMenu> selectByUserId(@Param("userId") String userId);
}

